package it.gat.controller;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import it.gat.controller.resource.ResourceFactory;
import it.gat.controller.utils.GatSession;
import it.gat.model.Cliente;
import it.gat.model.Operatore;
import it.gat.model.TipologiaDispositivo;
import it.gat.model.Utente;
import it.gat.webservice.string.Resource;

public class UtenteController {
	
	public void insertUtente(Utente utente)
	{
		if (utente instanceof Operatore)
		{
			Operatore operatore = (Operatore)utente;
			ResourceFactory.post(Resource.OPERATORE,operatore,Operatore.class);
		}
		if (utente instanceof Cliente)
		{
			Cliente cliente = (Cliente)utente;
			ResourceFactory.post(Resource.CLIENTEUTENTE,cliente,Cliente.class);
		}
		
	}
	
	public Class getClassByUsername(String nomeUtente)
	{
		return ResourceFactory.get(Resource.CLASSEUTENTE,nomeUtente,Class.class); 
	}
	
	public Utente getUtenteByUsername(String nomeUtente)
	{
		Class clazz = getClassByUsername(nomeUtente);
		if (clazz==Operatore.class)
			return getOperatoreByNomeUtente(nomeUtente);
		if (clazz==Cliente.class)
			return getClienteByNomeUtente(nomeUtente);
		return null;
	}
	
	public Operatore getOperatoreByNomeUtente(String nomeUtente)
	{
		return ResourceFactory.get(Resource.OPERATORE,nomeUtente,Operatore.class); 
	}
	
	public Cliente getClienteByNomeUtente(String nomeUtente)
	{
		return ResourceFactory.get(Resource.CLIENTE,nomeUtente,Cliente.class); 
	}
	
	public List<Utente> getUtentiList()
	{
		List<Utente> utenti = new ArrayList<Utente>();
		List<String> utentiTemp =  Arrays.asList(ResourceFactory.get(Resource.NOMEUTENTE,Resource.LISTAURI,String[].class)); 
		for (String nomeUtente:utentiTemp)
		{
			utenti.add(getUtenteByUsername(nomeUtente));
		}
		return utenti;
	}
	
	public List<Operatore> getTecniciList()
	{
		return Arrays.asList(ResourceFactory.get(Resource.TECNICO,Resource.LISTAURI,Operatore[].class)); 
	}
	
	public List<Operatore> getTecniciByTipologia(TipologiaDispositivo tipologiaDispositivo)
	{
		return Arrays.asList(ResourceFactory.get(Resource.TECNICOTIPOLOGIA,Resource.LISTAURI+"/"+tipologiaDispositivo.getIdTipologiaDispositivo(),Operatore[].class)); 
	}
	
	public void updateUtente(Utente utente)
	{
		if (utente instanceof Operatore)
		{
			Operatore operatore = (Operatore)utente;
			ResourceFactory.put(Resource.OPERATORE,operatore.getNomeUtente(),utente);
		}
		if (utente instanceof Cliente)
		{
			Cliente cliente = (Cliente)utente;
			ResourceFactory.put(Resource.CLIENTEUTENTE,cliente.getNomeUtente(),utente);
		}
	}
	
	public void deleteUtente(String username)
	{
		ResourceFactory.delete(Resource.UTENTE,username);
	}
	
	public boolean login(String nomeUtente,String password)
	{
		Utente utente = null;
		Class clazz = getClassByUsername(nomeUtente);
		if (clazz==Operatore.class)
			utente = getOperatoreByNomeUtente(nomeUtente);
		if (clazz==Cliente.class)
			utente = getClienteByNomeUtente(nomeUtente);
		if (utente.login(password))
		{
			GatSession.getInstance().setUtenteLoggato(utente);
			return true;
		}
		else
		{
			return false;
		}
	}

}
